"""
图表绘制模块
使用matplotlib绘制时间-内存曲线图
"""
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
from typing import List, Tuple, Optional
import os


class MemoryVisualizer:
    """内存可视化类"""
    
    def __init__(self, figsize=(12, 6)):
        """
        初始化可视化器
        
        Args:
            figsize: 图表尺寸（宽，高）
        """
        self.figsize = figsize
        plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS']  # 支持中文
        plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    
    def plot_from_records(self, records: List[Tuple], 
                         output_path: Optional[str] = None,
                         title: Optional[str] = None,
                         show_plot: bool = True):
        """
        从记录数据绘制图表
        
        Args:
            records: 记录列表，每个元素为 (timestamp, process_name, process_id, memory_mb, memory_percent)
            output_path: 输出文件路径，如果为None则不保存
            title: 图表标题
            show_plot: 是否显示图表
        """
        if not records:
            print("没有数据可绘制")
            return
        
        # 解析数据
        timestamps = []
        memory_mb_values = []
        memory_percent_values = []
        process_ids = set()
        process_names = set()
        
        for record in records:
            timestamp_str, process_name, process_id, memory_mb, memory_percent = record
            timestamp = datetime.fromisoformat(timestamp_str)
            timestamps.append(timestamp)
            memory_mb_values.append(memory_mb)
            memory_percent_values.append(memory_percent if memory_percent else 0)
            process_ids.add(process_id)
            process_names.add(process_name)
        
        # 创建图表
        fig, (ax1, ax2) = plt.subplots(2, 1, figsize=self.figsize, sharex=True)
        
        # 绘制内存占用（MB）
        ax1.plot(timestamps, memory_mb_values, 'b-', linewidth=1.5, label='内存占用 (MB)')
        ax1.set_ylabel('内存占用 (MB)', fontsize=12)
        ax1.set_title(title or f'进程内存监控 - {", ".join(process_names) if process_names else "未知进程"}', 
                     fontsize=14, fontweight='bold')
        ax1.grid(True, alpha=0.3)
        ax1.legend(loc='upper left')
        
        # 绘制内存占用百分比
        ax2.plot(timestamps, memory_percent_values, 'r-', linewidth=1.5, label='内存占用 (%)')
        ax2.set_xlabel('时间', fontsize=12)
        ax2.set_ylabel('内存占用 (%)', fontsize=12)
        ax2.grid(True, alpha=0.3)
        ax2.legend(loc='upper left')
        
        # 格式化时间轴
        ax2.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
        ax2.xaxis.set_major_locator(mdates.AutoDateLocator())
        plt.setp(ax2.xaxis.get_majorticklabels(), rotation=45, ha='right')
        
        # 调整布局
        plt.tight_layout()
        
        # 保存图表
        if output_path:
            plt.savefig(output_path, dpi=300, bbox_inches='tight')
            print(f"图表已保存到: {output_path}")
        
        # 显示图表
        if show_plot:
            plt.show()
        else:
            plt.close()
    
    def plot_from_database(self, db, process_id: Optional[int] = None,
                          start_time: Optional[str] = None,
                          end_time: Optional[str] = None,
                          output_path: Optional[str] = None,
                          title: Optional[str] = None,
                          show_plot: bool = True):
        """
        从数据库读取数据并绘制图表
        
        Args:
            db: Database实例
            process_id: 进程ID，如果为None则绘制所有进程
            start_time: 开始时间（ISO格式字符串）
            end_time: 结束时间（ISO格式字符串）
            output_path: 输出文件路径
            title: 图表标题
            show_plot: 是否显示图表
        """
        records = db.get_records(process_id=process_id, 
                               start_time=start_time, 
                               end_time=end_time)
        self.plot_from_records(records, output_path=output_path, 
                              title=title, show_plot=show_plot)
    
    def plot_realtime(self, records: List[Tuple], 
                     output_path: Optional[str] = None,
                     title: Optional[str] = None):
        """
        实时更新图表（用于监控过程中）
        
        Args:
            records: 记录列表
            output_path: 输出文件路径
            title: 图表标题
        """
        self.plot_from_records(records, output_path=output_path, 
                             title=title, show_plot=False)

